package com.general.framework.zzyy.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 当一个任务提交时，corePoolSize为0不创建核心线程，
 * SynchronousQueue是一个不存储元素的队列，可以理解为队里永远是满的，因此最终会创建非核心线程来执行任务。对于非核心线程空闲60s时将被回收。
 * 因为Integer.MAX_VALUE非常大，可以认为是可以无限创建线程的，在资源有限的情况下容易引起OOM异常
 */
public class CachedThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个CachedThreadPool线程池
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

        // 提交多个Runnable任务到线程池执行
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            cachedThreadPool.execute(() -> {
                System.out.println("正在执行任务 " + taskId + "，线程名称：" + Thread.currentThread().getName());
                try {
                    // 模拟任务执行耗时
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        // 再提交一个Callable任务（可以返回结果）到线程池执行，这里通过Future获取结果
        java.util.concurrent.Future<String> futureResult = cachedThreadPool.submit(() -> {
            System.out.println("正在执行Callable任务，线程名称：" + Thread.currentThread().getName());
            Thread.sleep(2000);
            return "Callable任务执行完毕，返回结果";
        });

        try {
            // 获取Callable任务的结果（会阻塞当前线程，直到任务完成）
            String result = futureResult.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 关闭线程池，不再接受新任务，但会等待已提交任务执行完成
        cachedThreadPool.shutdown();
    }
}